﻿//*****************************************************
//* File: CompAccount.cs
//* Author: Уваров А.Ф.
//* Date: 01.12.2022
//* Time: 12:41 
//* Version: 1.1.0
//* Notes: Модуль класса описания учетных записей серверов
//*****************************************************

using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace CompAccount {

  // класс описание учетных записей серверов
  public class DescrServ {

    // определение состояние данных по серверам
    public enum DataStatus {
      // неопределено
      None,
      // все нормально
      OK,
      // нет данных
      NoData,
      // нет файла
      NoFile,
      // ошибка формата данных в файле
      ErrFormat
    };

    // кодовая страница файла описания удаленных компьютнров (UTF-8)
    public const int CODE_PAGE = 65001;
    // имя ОС
    public const string WIN = "windows";
    public const string LINUX = "linux";

    // индексы массива параметров
    // имя сервера
    public const int NAME = 0;
    // IP адрес
    public const int IP = 1;
    // пользователь
    public const int USER = 2;
    // пароль
    public const int PASSWORD = 3;
    // тип операционной системы
    public const int OS = 4;
    // имя файла
    public const int NAMEFILE = 5;
    // длина массива параметров
    public const int LENGTH = 5;

    // текущий статус данных
    private DataStatus Stat = DataStatus.None;
    // кодовая страница файла описания удаленных компьютнров
    private int Code_Page = CODE_PAGE;
    // имя приложения
    private string Name_App = "";
    // компонент TextBox
    TextBox TB = null;

    // описание сервера
    public struct ServRec {
      public string Name;
      public string IP;
      public string User;
      public string Password;
      public string OS;
    }

    // массив определения серверов
    private ArrayList ServList;

    // конструктор класса
    public DescrServ () {
      this.ServList = new ArrayList();
      this.Stat = DataStatus.None;
      this.Code_Page = CODE_PAGE;
      this.Name_App = "";
      this.TB = null;
    }
    public DescrServ (TextBox TB, string NameApp = "", int CodePage = CODE_PAGE) {
      this.ServList = new ArrayList();
      this.Stat = DataStatus.None;
      this.Code_Page = CodePage;
      this.Name_App = NameApp;
      this.TB = TB;
    }

    public DataStatus Status {
      get {
        return Stat;
      }
    }

    public int CodePage {
      get {
        return Code_Page;
      }
      set {
        Code_Page = value;
      }
    }

    public string NameApp {
      get {
        return Name_App;
      }
      set {
        Name_App = value;
      }
    }

    public TextBox WinText {
      get {
        return TB;
      }
      set {
        TB = value;
      }
    }

    public ServRec this[int Index] {
      get {
        return (ServRec)ServList[Index];
      }
      set {
        ServList[Index] = value;
      }       
    }

    public int Count {
      get {
        return ServList.Count;
      }
    }

    public string[] GetArrParam (int Index) {
      if (ServList.Count == 0 || Index < 0)
        return null;
      ServRec Rec = (ServRec)ServList[Index];
      string[] Arr = new string[LENGTH];
      Arr[NAME] = Rec.Name;
      Arr[IP] = Rec.IP;
      Arr[USER] = Rec.User;
      Arr[PASSWORD] = Rec.Password;
      Arr[OS] = Rec.OS;
      return Arr;
    }

    public string GetName (int Index) {
      return ((ServRec)ServList[Index]).Name;
    }

    public string GetIP (int Index) {
      return ((ServRec)ServList[Index]).IP;
    }

    public string GetUser (int Index) {
      return ((ServRec)ServList[Index]).User;
    }

    public string GetPassword (int Index) {
      return ((ServRec)ServList[Index]).Password;
    }

    public string GetOS (int Index) {
      return ((ServRec)ServList[Index]).OS;
    }

    public bool ReadFile (string NameFile) {
      // объект файлового потока для чтения
      StreamReader oFR;
      ServRec Serv = new ServRec();
      string Str;

      ServList.Clear();
      if (File.Exists(NameFile))
        oFR = new StreamReader(NameFile, Encoding.GetEncoding(Code_Page));
      else {
        MessageBox.Show("Файл описания удаленных компьютеров: " + NameFile +
                        " - отсутствует!" + "\r\n",
                        "Ошибка " + Name_App,
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
        Stat = DataStatus.NoFile;
        return false;
      }
      try {
        while (!oFR.EndOfStream) {
          Str = oFR.ReadLine();
          Str = Str.Trim();
          if ((Str.IndexOf(";") == 0) || (Str.IndexOf("#") == 0) || (Str == ""))
            continue;
          string[] Arr = Str.Split(new char[] { ',' });
          if ((Arr.Length == LENGTH - 1) || (Arr.Length == LENGTH)) {
            Serv.Name = Arr[NAME];
            Serv.IP = Arr[IP];
            Serv.User = Arr[USER];
            Serv.Password = Arr[PASSWORD];
            if (Arr.Length == LENGTH - 1) {
              Serv.OS = WIN;
            }
            else {
              Serv.OS = Arr[OS].ToLower();
            }
            if (Serv.OS != WIN && Serv.OS != LINUX) {
              MessageBox.Show("Файл: " + NameFile +
                              " - неправильный тип ОС!" + "\r\n",
                              "Ошибка " + Name_App,
                              MessageBoxButtons.OK,
                              MessageBoxIcon.Error);
              ServList.Clear();
              Stat = DataStatus.ErrFormat;
              return false;
            }
            ServList.Add(Serv);
          }
          else {
            MessageBox.Show("Файл: " + NameFile +
                            " - неправильный формат данных!" + "\r\n",
                            "Ошибка " + Name_App,
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error);
            ServList.Clear();
            Stat = DataStatus.ErrFormat;
            return false;
          }
        }
        if (ServList.Count == 0) {
          MessageBox.Show("Файл: " + NameFile +
                          " - нет данных!" + "\r\n",
                          "Ошибка " + Name_App,
                          MessageBoxButtons.OK,
                          MessageBoxIcon.Error);
          oFR.Close();
          StreamWriter oFW = new StreamWriter(NameFile,
                               true, Encoding.GetEncoding(Code_Page));
          oFW.WriteLine("");
          oFW.Close();
          Stat = DataStatus.NoData;
          return false;
        }
      }
      finally {
        oFR.Close();
      }
      this.Stat = DataStatus.OK;
      return true;
    }

    // *************************************************************
    // * Function: IniText 
    // * Notes: Заполнение компонента TextBox шаблоном
    // *        файла описания удаленных компьютеров 
    // *

    public void IniText () {
      TB.Clear();
      TB.AppendText(
        ";-------------------------------------------------------" + "\r\n");
      TB.AppendText(
        "; " + Name_App + " Файл описания удаленных компьютеров" + "\r\n");
      TB.AppendText(
        ";-------------------------------------------------------" + "\r\n");
      TB.AppendText(";" + "\r\n");
      TB.AppendText("; Формат файла:" + "\r\n");
      TB.AppendText(";<Имя_компьютера>,<IP>,<Пользователь>,<Файл_ключа | Пароль>,<linux | windows>" + "\r\n");
      TB.AppendText(";        ..." + "\r\n");
      TB.AppendText(";<Имя_компьютера>,<IP>,<Пользователь>,<Файл_ключа | Пароль>,<linux | windows>" + "\r\n");
      TB.AppendText(";" + "\r\n");
    }

    // *** End of IniText ***      

    // *************************************************************
    // * Function: LoadTextBox 
    // * Notes: Загрузка данных файла в компонент типа TextBox
    // *

    public void LoadTextBox (string NameFile) {
      if (TB != null) {
        if (Stat == DataStatus.OK || Stat == DataStatus.None) {
          // чтение файла и загрузка содержимого в окно
          if (File.Exists(NameFile)) {
            // объект файлового потока для чтения
            StreamReader oFR = new StreamReader(NameFile, Encoding.GetEncoding(CODE_PAGE));
            TB.Clear();
            while (!oFR.EndOfStream) {
              TB.AppendText(oFR.ReadLine() + "\r\n");
            }
            oFR.Close();
            Stat = DataStatus.OK;
          }
          else {
            IniText();
            Stat = DataStatus.OK;
          }
        }
        else {
          IniText();
          Stat = DataStatus.OK;
        }
      }
      else {
        Stat = DataStatus.None;
      }
    }

    // *** End of LoadTextBox ***      

    // *************************************************************
    // * Function: SaveTextBox 
    // * Notes: Сохранение данных компонента TextBox в файле 
    // *

    public void SaveTextBox (string NameFile) {
      string Str = "";

      if (TB != null) {
        // сохранить отредактированное содержимое компонента TextBox в файле
        Str = this.TB.Text;
        try {
          File.WriteAllText(NameFile, Str, Encoding.GetEncoding(CODE_PAGE));
        }
        catch (Exception Err) {
          MessageBox.Show("Приложение " + Name_App +": "  + Err.Message,
                          "Ошибка",
                          MessageBoxButtons.OK,
                          MessageBoxIcon.Error);
          Stat = DataStatus.ErrFormat;
          return;
        }
        ReadFile(NameFile);
        Stat = DataStatus.OK;
      }
      else {
        Stat = DataStatus.None;
      }
    }

    // *** End of SaveTextBox ***      

  }

}

//*** End of CompAccount.cs ***********
